<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body>
  
  </body>
  
  <script>
    /* 字符：字符规则只能匹配一个字符 */
    {
      let str = 'numa,numb,numc,numd,numaaa,numA,numB,num1,num12';
      
      /* [abc]：匹配a、b或c中的一个字符 */
      console.log((str.match(/num[abc]/g)));//['numa', 'numb', 'numc', 'numa']
      
      /* [^abc]：匹配a、b和c之外的任意字符 */
      console.log((str.match(/num[^abc]/g)));//['numd', 'numA', 'numB', 'num1', 'num1']
      
      /* [a-zA-Z]：匹配a到z或A到Z中的一个字符 */
      console.log((str.match(/num[a-bA-B]/g)));//['numa', 'numb', 'numa', 'numA', 'numB']
      
      /* [a-zA]：匹配a到z或A中的一个字符 */
      console.log((str.match(/num[a-bA]/g)));//['numa', 'numb', 'numa', 'numA']
    }
    
    /* // 2.分组
    {
      /!**
       * 分组：使用一系列括号包围一系列字符、字符类以及量词来使用，支持分组的嵌套
       *    /(bad)?/：一个或0个bad
       *    /(bad){1,2}/：1到2个bad
       *    /(b[ae]d?)+/：1个或多个ba、be、bad、bed
       *!/
        
        // 分组
      var str = 'bb ba da bad dad aa';
      let reg1 = /([bd]ad?)/gi;
      console.log(str.match(reg1));//['ba', 'da', 'bad', 'dad']
      
      // 候选：表达式中可能匹配两种或以上文本时，可采用管道符(|)表示各种候选文本
      var str1 = 'red';
      var str2 = 'black';
      let reg2 = /(red|black)/;
      console.log(reg2.test(str1));//true
      console.log(reg2.test(str2));//true
      
      // 捕获分组
      var str = '#123456789';
      let reg31 = /#(\d+)/;
      console.log(reg31.test(str));//true
      console.log(RegExp.$1);//123456789
      
      var str = '1234 56789';
      let reg32 = /(\d{4}) (\d{5})/;
      console.log(str.replace(reg32, '$2 - $1'));//56789 - 1234
      
      var str = '1221 2553 1234';
      let reg33 = /(\d)(\d)\\2\\1/g;
      console.log(str.match(reg33));//?????
      
      // 非捕获性分组
      var str = 'test123456789';
      let reg41 = /st(?:\d+)/;
      console.log(reg41.test(str));//true
      console.log(RegExp.$1);//空
      
      var str1 = 'bedroom';
      var str2 = 'bedding';
      let reg42 = /(bed(?=room))/;
      console.log(reg42.test(str1));//true
      console.log(reg42.test(str2));//false
      console.log(RegExp.$1);//bed
    }
    
    // 3.边界
    {
      // ^行开头；$行结尾；\b单词边界；\B非单词的边界
      var str = 'Important word is the last one.';
      let reg1 = /(\w+)\.$/;
      console.log(reg1.test(str));//true
      console.log(RegExp.$1);//one
      
      var str = ' First second thind fourth fifth sixth ';
      let reg2 = /\b(\S+)\b/g;
      console.log(str.match(reg2));//['First', 'second', 'thind', 'fourth', 'fifth', 'sixth']
    }
    
    /!**
     * 练习：识别以下正则表达式
     *      /^\w+@\w+\.\w+$/
     *      /^((\d{3,4})|\d{3,4}-)?\d{7,8}$/
     *      /^(0?[1-9]|1[0-2])$/
     *      /Windows(?=95 |98 |NT )/
     *      /^((0?[1-9])|((1|2)[0-9])|30|31)$/
     *      /(\d{1,3}\.){3}\d{1,3}/
     *!/ */
  </script>
</html>